package eps.einfachesFormular;

import eps.fortgeschrittenesFormular.Sensor;
import eps.werkzeuge.Liste;
import static eps.werkzeuge.Tupel.*;
import eps.werkzeuge.DreiTupel;

/**
 * Diese Klasse soll exemplarisch zeigen, wie einfache Benutzerinteraktion fakultativ
 * in der 10.Klasse umgesetzt werden koennte.<BR>
 * Sensorobjekte kann man sich als Bausteine vorstellen, die automatisch nach Erzeugung
 * dem Menue des (Standard-)Formulars am Ende hinzugefuegt werden.<BR> 
 * Das Anzeigen bereits
 * angezeigter Sensorobjekte ist wirkungslos. Das Verstecken sorgt fuer ein Verschwinden
 * des zugehoerigen Menueeintrags. Erneutes Anzeigen fuegt den Menueeintrag am Ende hinzu.
 * Angezeigte Sensorobjekte reagieren auf Auswahl "ihres" Menueeintrags 
 * (d.h. ein Mensch waehlt z.B. mit Maus im Formularfenster unter der Rubrik Ereignisse aus)
 * wie in der Methode ausloesen festgelegt.<BR> 
 * Der Beschreibungstext, der im Menueeintrag zu lesen ist, kann auch nach Erzeugung
 * eines Sensorobjekts jederzeit mit dem Dienst textSetzen passend festgelegt werden. 
 * Dienste wie textSetzen (u.a.) sind in der abstrakten Klasse Sensor
 * definiert. In Unterklassen dieser Klasse Sensor, wie z.B. der Klasse Bildanzeigesensor
 * ist typischerweise folgendes zu definieren: <BR>
 * geeignete Attribute, <BR>
 * ein Konstruktor, welcher Beziehungen zu
 * Objekten aufbaut, die 1) bei Ausloesen zu reagieren haben oder/und 2) Nutzereingaben 
 * bereithalten <BR>
 * die Methode ausloesen in welcher passende Reaktionen festgelegt sind. Eine Definition
 * der Methode auslosen wird von der Oberklasse Sensor erzwungen in jeder Unterklasse.
 * 
 * 
 * @author Ute Heuer 
 * @version 0.1
 */
public class Bildanzeigesensor extends Sensor {
    private Liste<DreiTupel<Kontrollkaestchen, String, Bild>> tabelle;

    /**
     * Sie muessen eine Bildbeschreibung angeben. Bevor Sie diesen Konstruktor
     * aufrufen, empfiehlt es sich, ein Bild erzeugt zu haben. Dieses koennen Sie
     * dann als zweiten Eingangswert einfuellen. 
     * Vergessen Sie nicht, nach Aufruf des Konstruktors einen Blick in das Menue
     * "Ereignisse" zu werfen...
     */
    public Bildanzeigesensor(String bildbeschreibung, Bild gewuenschtesBild) {
        super();
        tabelle = new Liste<DreiTupel<Kontrollkaestchen, String, Bild>>();
        textSetzen("Anzeigewuensche abschicken");
        auswahlHinzufuegen(bildbeschreibung, gewuenschtesBild);
    }
    /**
     * Sie muessen eine Bildbeschreibung angeben. Bevor Sie diese Methode
     * aufrufen, empfiehlt es sich, ein Bild erzeugt zu haben. Dieses koennen Sie
     * dann als zweiten Eingangswert einfuellen.
     */    
    public void auswahlHinzufuegen(String bildbeschreibung, Bild gewuenschtesBild) {
        Kontrollkaestchen kaestchen = new Kontrollkaestchen();
        kaestchen.beschriftungSetzen("Bitte " + bildbeschreibung + " anzeigen!");
        kaestchen.anzeigen();
        tabelle.hineinstecken(tupel(kaestchen, gewuenschtesBild.dateinameGeben(), gewuenschtesBild));
        gewuenschtesBild.dateinameSetzen("Platzhalter.png");
        gewuenschtesBild.anzeigen();
    }

    /**
     * Wenn der zugehoerige Menueeintrag "Anzeigewuensche auswerten" 
     * angewaehlt wird, dann wird die Methode ausloesen()
     * aufgerufen.
     */
    public void ausloesen() {
        for (DreiTupel<Kontrollkaestchen, String, Bild> zeile : tabelle) {
            if (zeile.erste.istAusgewaehlt()) {
                zeile.dritte.dateinameSetzen(zeile.zweite);
            } else {
                zeile.dritte.dateinameSetzen("Platzhalter.png");
            }
        }
    }
}
